草庐IT

Android AsyncTask 内存泄漏

全部标签

c++ - 定位内存泄漏

我目前正在使用带有CrtDbg的VisualStudio2012调试一些代码,删除或至少定位内存泄漏。问题是,只要分配号不变,追查分配还是很容易的。当分配数变化很大(或者不是真正确定性的)时,如何定位泄漏的分配点?我可以至少说一下,哪个模块正在分配内存吗?我在关闭应用程序时有以下几行:Detectedmemoryleaks!Dumpingobjects->{2789444}normalblockat0x0000000006103CB0,32byteslong.Data:B871E466000000000000000000000000{1269709}normalblockat0x000

c++ - 包装毛库的最佳实践内存管理

ooqp库已在我的工作场所投入使用。目前有一个学生正在处理它,我想知道处理这个问题的最佳方法。以下是程序使用的函数示例:newQpGenSparse(double**c,intnx,int**irowQ,intnnzQ,int**jcolQ,double**dQ,double**xlow,char**ixlow,double**xupp,char**ixupp,int**irowA,intnnzA,int**jcolA,double**dA,double**b,intmy,int**irowC,intnnzC,int**jcolC,double**dC,double**clow,int

c++ - 模拟游戏机的内存映射,根据提供的地址访问不同的位置

我正在为旧游戏机实现模拟器,主要用于学习目的。此控制台将rom和许多其他内容映射到其地址空间内的区域。某些位置也被镜像,以便多个地址可以对应于相同的物理位置。我想效仿这一点,但我不确定这样做的好方法是什么(也不知道这个过程叫什么,因此这个有点笼统的问题)。一个有用的东西是一个简单的、无序的map。让它包含绝对地址和指向我的数据结构的相应指针。这样,我就可以轻松地将我需要的所有内容映射到系统的地址空间中。这种方法的问题在于,它显然是一种内存消耗。由于上述镜像,即使是小rom,我最终也有近千万个条目。当然,这不是正确的做法吗?非常感谢任何帮助。编辑:提供一些关于我是如何做到这一点的细节:有

C++动态内存分配探秘:new与malloc的关键差异及实例解析

 概述:在C++中,new和malloc均用于动态内存分配,但存在关键差异。new是C++运算符,能调用构造函数,返回类型明确;而malloc是C函数,仅分配内存,需手动类型转换。示例源代码生动演示了它们在构造函数调用和类型信息方面的不同。在C++中,new 和 malloc 都用于动态内存分配,但它们之间有一些重要的区别。以下是对它们的详细描述,包括方法、步骤和相应的示例源代码。new和malloc的区别:1.使用方法:new: 是C++的运算符,能够调用对象的构造函数,返回类型明确。malloc: 是C语言的库函数,只分配内存块,返回void*,不会调用对象的构造函数。2.类型信息:new

c++ - 当内存可用时,realloc() 返回 NULL

我有一个c++程序在具有12GB内存的Windows7机器上运行。编译器和链接器是VisualStudio2013Express。该程序使用OGDF库。我将库源代码编译成具有ReleaseX64配置的静态库,并在我的项目中引用了该库。当我运行问题(调试x64配置)时,OGDF库中的代码抛出异常,指示没有足够的可用内存;E*p=static_cast(realloc(m_pStart,sNew*sizeof(E)));if(p==0)OGDF_THROW(InsufficientMemoryException);我暂停程序并打开调试窗口并检查了sNew=9M和sizeof(E)=8的值,

c++ - 在单线程应用程序中在堆栈上分配大量内存是否可以?

我知道如果你有一个多线程应用程序,并且你需要分配大量内存,那么你应该在堆上分配。堆栈空间在应用程序的线程之间划分,因此当您创建新线程时,每个线程的堆栈大小会变小。因此,如果您试图在堆栈上分配大量内存,它可能会溢出。但是,假设您有一个单线程应用程序,堆栈大小是否与堆大小基本相同?我在别处读到,堆栈和堆在地址空间中没有明确定义的边界,而是相互生长。附言被分配对象的生命周期不是问题。对象首先在程序中创建,并在退出时清理。我不必担心它会超出范围,从而从堆栈空间中清除。 最佳答案 不,堆栈大小与堆大小不同。堆栈对象以后进先出的方式被压入/弹出

c++ - std::shared_ptr 预分配内存

我想在一个堆请求(如std::make_shared)中为shared_ptr的控制block和value_type预分配内存,但是不要立即在其中构造任何对象。当我实际需要构造对象时,使用放置new。可能吗?std::make_shared或std::allocate_shared似乎都无法解决我的问题。 最佳答案 我建议创建延迟初始化包装类,它本身包含足够的内存供您稍后要初始化的对象使用。这个包装器甚至可以有特殊的方法来在析构函数中调用placementnew和delete初始化对象。

c++ - 确保 QByteArray 拥有它的内存 (QByteArray::fromRawData)

假设我们有一个功能商店voidstore(constQByteArray&data);此函数的工作是获取数据并将其存储起来。不幸的是,如果参数是用QByteArray::fromRawData(ptr,size)创建的,那么这样做是不安全的,因为它及其所有拷贝都要求ptr保持有效.因此store无法禁止其调用者传入这样的数组,将data视为constchar*在类固醇上或使用detach强制深度复制。所有这些都不令人满意,尤其是后者会损害性能,因为如果data在传递到store之前被COW复制,我们将进行不必要的深度复制。QByteArray有一个private函数nulTermina

java - Java 和 C++ 之间的共享内存

我试图在C++中创建一些内存并在Java中访问它。在C++方面,我知道我可以使用shm_open和mmap来获得内存区域并将一些数据写入其中。但是,我怎样才能打开Java端的内存映射文件?有人建议使用MappedByteBuffer但它如何访问提供给shm_open的“路径”(它只存在于内存中,因此无法从中初始化File)。我可以在不使用JNI的情况下执行此操作吗? 最佳答案 在Linux环境下共享内存有特殊的内存段:/dev/shmshm_open中提供的名称(例如“elo320”)用于创建文件/dev/shm/elo320这个路

c++ - 为维数增加(点数)的点云分配 CUDA 设备内存

我正在编写一个程序,我需要:对图像的每个像素进行测试如果测试结果为真,我必须向点云中添加一个点如果测试结果为假,什么都不做我已经在CPU端C++上编写了一个工作代码。现在我需要使用CUDA加速它。我的想法是让一些block/线程(我猜是每个像素一个线程)并行执行测试,如果测试结果为真,则让线程向云中添加一个点。我的麻烦来了:如果我事先不知道要插入到点云中的点数,我如何在设备内存中为点云分配空间(使用cudaMalloc或类似工具)?我是否必须分配固定数量的内存,然后在每次点云达到限制维度时增加它?还是有一种“动态”分配内存的方法? 最佳答案